# [Spring Data JPA] ๋ํฐ ์ฒดํน (Dirty Checking)
ํธ๋์ญ์
์์์ Entity์ ๋ณ๊ฒฝ์ด ์ผ์ด๋ฌ์ ๋
๋ณ๊ฒฝํ ๋ด์ฉ์ ์๋์ผ๋ก DB์ ๋ฐ์ํ๋ ๊ฒ
ORM ๊ตฌํ์ฒด ๊ฐ๋ฐ ์ ๋ํฐ ์ฒดํน์ด๋ผ๋ ๋ง์ ์์ฃผ ๋ณผ ์ ์๋ค.
๋ํฐ ์ฒดํน์ด ์ด๋ค ๊ฒ์ ๋ปํ๋ ์ง ๊ฐ๋จํ ์ดํด๋ณด์.
JPA๋ก ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ ๊ตฌํํ ํ ๊ฐ์ง ๊ธฐ๋ฅ์ ์๋ก ๋ค์ด๋ณด์
# ex) ์ฃผ๋ฌธ ์ทจ์ ๊ธฐ๋ฅ
@Transactional
public void cancelOrder(Long orderId) {
//์ฃผ๋ฌธ ์ํฐํฐ ์กฐํ
Order order = orderRepository.findOne(orderId);
//์ฃผ๋ฌธ ์ทจ์
order.cancel();
}
orderId
๋ฅผ ํตํด ์ฃผ๋ฌธ์ ์ทจ์ํ๋ ๋ฉ์๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ํ๊ธฐ ์ํด์ , update
์ ๊ฐ์ ์ฟผ๋ฆฌ๊ฐ ์์ด์ผํ ๊ฒ ๊ฐ์๋ฐ ์กด์ฌํ์ง ์๋๋ค.
ํ์ง๋ง, ์ค์ ๋ก ์ด ๋ฉ์๋๋ฅผ ์คํํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ update๊ฐ ์ ์ด๋ฃจ์ด์ง๋ค.
- ํธ๋์ญ์ ์์
orderId
๋ก ์ฃผ๋ฌธ Entity ์กฐํ- ํด๋น Entity ์ฃผ๋ฌธ ์ทจ์ ์ํ๋ก Update
- ํธ๋์ญ์ ์ปค๋ฐ
์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ์ด ๋ฐ๋ก '๋ํฐ ์ฒดํน(Dirty Checking)'์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
๊ทธ๋ฅ ๋ํฐ ์ฒดํน์ ๋จ์ด๋ง ๊ฐ๋จํ ํด์ํ๋ฉด ๋ณ๊ฒฝ ๊ฐ์ง
๋ก ๋ณผ ์ ์๋ค. ์ข ๋ ์์ธํ ๋งํ๋ฉด, Entity์์ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ๊ฑธ ๊ฐ์งํ ๋ค, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์์์ผ์ค๋ค๋ ์๋ฏธ๋ค. (๋ณ๊ฒฝ์ ์ต์ด ์กฐํ ์ํ๊ฐ ๊ธฐ์ค์ด๋ค)
Dirty : ์ํ์ ๋ณํ๊ฐ ์๊น
Checking : ๊ฒ์ฌ
JPA์์๋ ํธ๋์ญ์ ์ด ๋๋๋ ์์ ์ ๋ณํ๊ฐ ์๋ ๋ชจ๋ ์ํฐํฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์์์ ๋ฐ์์ ์์ผ์ค๋ค. ์ฆ, ํธ๋์ญ์ ์ ๋ง์ง๋ง ์์ ์์ ๋ค๋ฅธ ์ ์ ๋ฐ๊ฒฌํ์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก update ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค์ฃผ๋ ๊ฒ์ด๋ค.
- JPA์์ Entity๋ฅผ ์กฐํ
- ์กฐํ๋ ์ํ์ Entity์ ๋ํ ์ค๋ ์ท ์์ฑ
- ํธ๋์ญ์ ์ปค๋ฐ ํ ํด๋น ์ค๋ ์ท๊ณผ ํ์ฌ Entity ์ํ์ ๋ค๋ฅธ ์ ์ ์ฒดํฌ
- ๋ค๋ฅธ ์ ๋ค์ update ์ฟผ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ฌ
์ด๋ ๋ํฐ ์ฒดํน์ ๊ฒ์ฌํ๋ ๋์์ ์์์ฑ ์ปจํ
์คํธ
๊ฐ ๊ด๋ฆฌํ๋ Entity๋ก๋ง ๋์์ผ๋ก ํ๋ค.
์ค์์, ๋น์์ Entity๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ง๋ผ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์์ํค์ง ์๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ํฐ ์ฒดํน์ ์คํํ๋ฉด, SQL์์๋ ๋ณ๊ฒฝ๋ ์ํฐํฐ์ ๋ชจ๋ ๋ด์ฉ์ update ์ฟผ๋ฆฌ๋ก ๋ง๋ค์ด ์ ๋ฌํ๋๋ฐ, ์ด๋ ํ๋๊ฐ ๋ง์์ง๋ฉด ์ ์ฒด ํ๋๋ฅผ updateํ๋๊ฒ ๋นํจ์จ์ ์ผ ์๋ ์๋ค.
์ด๋๋ @DynamicUpdate
๋ฅผ ํด๋น Entity์ ์ ์ธํ์ฌ ๋ณ๊ฒฝ ํ๋๋ง ๋ฐ์์ํค๋๋ก ๋ง๋ค์ด์ค ์ ์๋ค.
@Getter
@NoArgsConstructor
@Entity
@DynamicUpdate
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String product;